//
// Created by martin on 7/7/21.
//

#ifndef FTPSERVER_SESSION_H
#define FTPSERVER_SESSION_H

#include <time.h>
#include <arpa/inet.h>
#include <bits/posix1_lim.h>


#define COMMAND_LINE_MAX      1024   /* 一行命令最大长度, 单位bytes */
#define COMMAND_MAX           5      /* 单个命令最大长度, 单位bytes */

/**
 * 服务器数据连接模式
 */
typedef enum {
    DataConn_Mode_IDLE = 0, /* IDLE mode (default) */
    DataConn_Mode_PASV,     /* PASV mode */
    DataConn_Mode_PORT      /* PORT mode */
}DataConn_Mode_t;

/**
 * 数据传输类型
 */
typedef enum {
    Transfer_Type_ASCII = 0,
    Transfer_Type_Binary
}Transfer_Type_t;

/** LIST命令文件项格式类型 */
typedef enum {
    List_Type_Detail = 0,
    List_Type_Simple
}List_Type_t;

typedef enum {
    CMD_CWD_PATH_TYPE_ABSULOTE = 0, /* CWD路径类型为绝对路径 */
    CMD_CWD_PATH_TYPE_RELATIVE      /* CWD路径类型为相对路径 */
}CMD_CWD_PATH_t;

typedef struct session {
    /* 控制连接 */
    int  ctrlconn_sockfd;           /* ftp控制连接fd */
    char cmdline[COMMAND_LINE_MAX]; /* 一行命令文本, 如USER<SP><username><CRLF> */
    char cmd[COMMAND_MAX];          /* 单个命令, 如USER, PASS, e.g. */
    char arg[COMMAND_LINE_MAX];     /* 单个命令对应参数, 如USER命令的<username> */
    time_t ctrlconn_refreshtime;        /* 控制连接刷新时间 */

    /* 数据连接 */
    int dataconn_listenfd;         /* ftp 数据监听fd  */
    int dataconn_sockfd;           /* ftp数据连接fd */
    DataConn_Mode_t dataconn_mode;  /* 数据连接模式 */
    Transfer_Type_t transfer_type; /* 文件传输模式 */
    List_Type_t list_type;
    char ip[INET_ADDRSTRLEN];       /* 服务器ip地址 */
    int data_port;                  /* 数据连接服务器端端口 */
    int cur_start_pos;                  /* 当前位置标记, 用于断点续传初始化位置 */
    int dataconn_close;                /* 关闭数据连接 */
    time_t dataconn_refreshtime;        /* 数据连接刷新时间 */
    CMD_CWD_PATH_t cmd_cwd_path;

    /* 登录用户 */
    int uid;
    char root_dir[_POSIX_PATH_MAX]; /* ftp服务器默认根目录 */
    char cur_work_dir[_POSIX_PATH_MAX]; /* 当前工作目录 */

    int close;                      /* 会话关闭状态. 1: 关闭会话; 0: 不关闭会话 */
}session_t;


session_t *session_create(int ctrlconn_sockfd);
void session_close(session_t *pses);
void session_destroy(session_t *pses);
int session_checkloginstat(session_t *pses);
int session_close_dataconn(session_t *pses);

#endif //FTPSERVER_SESSION_H
